package main

import (
	"fmt"
	"reflect"
)

/*
   反射
	 有时我们需要一个函数，这个函数有能力统一处理各种值类型，而这些类型可能无法共享
	 同一个接口，也可能布局未知，也有可能这个类型在我们设计函数时还不存在，这个时候
	 可以使用反射。

	 可实现功能：
	 1、反射可以在程序运行期间动态的获取变量的各种信息，比如变量的类型 类别
	 2、如果是结构体，通过反射还可以获取结构体本身的信息，比如结构体的字段、结构体的方法
	 3、通过反射，可以修改变量的值，可以调用关联的方法

	 golang语言的变量是分为两部分的：
	 1、类型信息：预先定义好的元信息
	 2、值信息：程序运行过程中可动态变化的

	 reflect.Typeof()  reflect.ValueOf()
*/

//反射获取任意变量类型

func reflectFn(x interface{}) {
	fmt.Println(reflect.TypeOf(x))
	fmt.Println(reflect.ValueOf(x))
}

type myInt int

type People struct {
	Name string
	Age  int
}

type Computer interface {
	stop()
	start()
}

func main() {
	var a int
	reflectFn(a)
	b := 23.4
	reflectFn(b)
	c := false
	reflectFn(c)
	var d myInt
	reflectFn(d) //main.myInt
	var e = People{
		Name: "张三",
		Age:  20,
	}
	reflectFn(e) //main.People
	var f Computer
	reflectFn(f) //<nil>

	var g = 66
	reflectFn(&g) //*int

}
